package read;

import org.apache.poi.hssf.usermodel.HSSFWorkbook;
import org.apache.poi.ss.usermodel.*;

import java.io.FileInputStream;
import java.text.SimpleDateFormat;
import java.util.Date;

/**
 * @author ghp
 * @date 2023/1/24
 * @title
 * @description
 */
public class ReadExcel03 {
    public static void main(String[] args) {
        try {
//            new ReadExcel03().readExcel03();
            new ReadExcel03().readExcelCellType();
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

    /**
     * 读取03版本的Excel
     */
    public void readExcel03() throws Exception {
        // 通过文件流读取工作簿
        FileInputStream fis = new FileInputStream("D:/Test/test-03.xls");
        // 获取工作簿对象
        Workbook workbook = new HSSFWorkbook(fis);
        // 获取表，可以通过下标的方式读取，也可以通过表名读取
        Sheet sheet = workbook.getSheetAt(0);
//        Sheet sheet = workbook.getSheet("03版本测试");
        // 获取行，采用索引号获取
        Row row = sheet.getRow(0);
        // 获取单元格
        Cell cell = row.getCell(0);
        // 读取数据
        String data = cell.getStringCellValue();
        // 关流
        fis.close();

        System.out.println("data = " + data);
    }

    /**
     * 批量读取03版本Excel中的数据
     */
    public void readExcelCellType() throws Exception {
        // 通过文件流读取工作簿
        FileInputStream fis = new FileInputStream("D:/Test/test-03.xls");
        // 获取工作簿对象
        Workbook workbook = new HSSFWorkbook(fis);
        // 获取表，可以通过下标的方式读取，也可以通过表名读取
//        Sheet sheet = workbook.getSheetAt(0);
        Sheet sheet = workbook.getSheet("03版本测试");

        // 获取标题数据
        // 获取Row对象，用于获取表中标题的数据，即第一行的数据
        Row title = sheet.getRow(0);
        // 标题不能为空
        if (title != null) {
            // 获取第一行标题的数量
            int cellNum = title.getPhysicalNumberOfCells();
            // 遍历第一行获取所有单元格中的数据
            for (int i = 0; i < cellNum; i++) {
                // 获取单元格
                Cell cell = title.getCell(i);
                if (cell != null) {
                    // 获取单元格中的数据，也就是标题数据
                    String cellValue = cell.getStringCellValue();
                    System.out.println("cellValue = " + cellValue);
                }
            }
        }

        System.out.println("==================================");

        // 获取标题以下的数据
        // 获取表中总的行数（注意等会要去掉第一行）
        int rowNum = sheet.getPhysicalNumberOfRows();
        // 跳过第一行获取其余行单元格中的数据
        for (int i = 1; i < rowNum; i++) {
            Row row = sheet.getRow(i);
            if (row != null) {
                // 获取一行中总的单元格数量
                int cellNum = row.getPhysicalNumberOfCells();
                for (int j = 0; j < cellNum; j++) {
                    Cell cell = row.getCell(j);
                    if (cell != null) {
                        // 注意：如果数据格式不相同会抛异常，所以需要判断数据的类型
                        // 获取所有读取数据的类型
                        CellType cellType = cell.getCellType();
                        String cellValue = null;
                        // 根据不同的数据类型读取数据
                        switch (cellType) {
                            case STRING: // 字符串类型
                                cellValue = cell.getStringCellValue();
                                break;
                            case NUMERIC: // 数值类型
                                // 需要先判断是否是日期类型，因为使用字符串的读取方式读取日期，会有问题
                                if (DateUtil.isCellDateFormatted(cell)) {
                                    // 如果当前是日期类型，则使用日期数据的读取方式
                                    Date cellDate = cell.getDateCellValue();
                                    // 将日期进行格式转发，并转成字符串
                                    cellValue = new SimpleDateFormat("yyyy-MM-dd").format(cellDate);
                                } else {
                                    // 如果当前是日期类型，则使用数值数据的读取方式
                                    cellValue = cell.toString();
                                }
                                break;
                            case BLANK: // 空字符串
                                System.out.println("当前单元格为空");
                                break;
                            case BOOLEAN: // 布尔类型
                                cellValue = String.valueOf(cell.getBooleanCellValue());
                                break;
                            case ERROR: // 错误类型
                                System.out.println("格式错误");
                                break;
                        }
                        System.out.println("cellValue = " + cellValue);
                    }
                }
            }
        }
        fis.close();
    }

}
